home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / Src / Ch10 / SierpG.frm (.txt) < prev    next >
Visual Basic Form  |  1999-06-08  |  5KB  |  155 lines

  1. VERSION 5.00
  2. Begin VB.Form frmSierpG 
  3.    Caption         =   "SierpG"
  4.    ClientHeight    =   4335
  5.    ClientLeft      =   2280
  6.    ClientTop       =   900
  7.    ClientWidth     =   5310
  8.    LinkTopic       =   "Form1"
  9.    PaletteMode     =   1  'UseZOrder
  10.    ScaleHeight     =   4335
  11.    ScaleWidth      =   5310
  12.    Begin VB.TextBox txtDepth 
  13.       Height          =   285
  14.       Left            =   480
  15.       MaxLength       =   3
  16.       TabIndex        =   0
  17.       Text            =   "4"
  18.       Top             =   0
  19.       Width           =   375
  20.    End
  21.    Begin VB.PictureBox picCanvas 
  22.       AutoRedraw      =   -1  'True
  23.       Height          =   4335
  24.       Left            =   960
  25.       ScaleHeight     =   285
  26.       ScaleMode       =   3  'Pixel
  27.       ScaleWidth      =   285
  28.       TabIndex        =   3
  29.       Top             =   0
  30.       Width           =   4335
  31.    End
  32.    Begin VB.CommandButton cmdGo 
  33.       Caption         =   "Go"
  34.       Default         =   -1  'True
  35.       Height          =   375
  36.       Left            =   120
  37.       TabIndex        =   1
  38.       Top             =   480
  39.       Width           =   615
  40.    End
  41.    Begin VB.Label Label1 
  42.       Caption         =   "Depth"
  43.       Height          =   255
  44.       Index           =   0
  45.       Left            =   0
  46.       TabIndex        =   2
  47.       Top             =   0
  48.       Width           =   495
  49.    End
  50. Attribute VB_Name = "frmSierpG"
  51. Attribute VB_GlobalNameSpace = False
  52. Attribute VB_Creatable = False
  53. Attribute VB_PredeclaredId = True
  54. Attribute VB_Exposed = False
  55. Option Explicit
  56. Private Type POINTAPI
  57.     X As Long
  58.     Y As Long
  59. End Type
  60. Private Declare Function Polygon Lib "gdi32" (ByVal hdc As Long, lpPoint As POINTAPI, ByVal nCount As Long) As Long
  61. ' Erase the center triangle from this one.
  62. Private Sub SierpinskiErase(ByVal depth As Integer, ByVal x1 As Single, ByVal y1 As Single, ByVal x2 As Single, ByVal y2 As Single, ByVal x3 As Single, ByVal y3 As Single)
  63. Dim newy As Single
  64. Dim newx1 As Single
  65. Dim newx2 As Single
  66. Dim newx3 As Single
  67. Dim points(1 To 3) As POINTAPI
  68.     ' Find the corners of the middle triangle.
  69.     newy = (y1 + y2) / 2
  70.     newx1 = (3 * x1 + x3) / 4
  71.     newx2 = (x1 + x3) / 2
  72.     newx3 = (x1 + 3 * x3) / 4
  73.     ' Erase the middle triangle.
  74.     points(1).X = newx1
  75.     points(1).Y = newy
  76.     points(2).X = newx3
  77.     points(2).Y = newy
  78.     points(3).X = newx2
  79.     points(3).Y = y1
  80.     Polygon picCanvas.hdc, points(1), 3
  81.     ' Recursively erase other subtriangles.
  82.     If depth > 0 Then
  83.         SierpinskiErase depth - 1, x1, y1, newx1, newy, newx2, y1
  84.         SierpinskiErase depth - 1, newx1, newy, newx2, y2, newx3, newy
  85.         SierpinskiErase depth - 1, newx2, y1, newx3, newy, x3, y1
  86.     End If
  87. End Sub
  88. ' Draw a complete Sierpinski gasket.
  89. Private Sub SierpinskiGasket(ByVal depth As Integer, ByVal x1 As Single, ByVal y1 As Single, ByVal x2 As Single, ByVal y2 As Single, ByVal x3 As Single, ByVal y3 As Single)
  90. Dim points(1 To 3) As POINTAPI
  91.     ' Erase the picture.
  92.     picCanvas.Line (0, 0)-(picCanvas.ScaleWidth, picCanvas.ScaleHeight), picCanvas.BackColor, BF
  93.     ' Draw the main filled triangle.
  94.     picCanvas.AutoRedraw = True
  95.     picCanvas.FillStyle = vbFSSolid
  96.     picCanvas.FillColor = vbBlack
  97.     points(1).X = x1
  98.     points(1).Y = y1
  99.     points(2).X = x2
  100.     points(2).Y = y2
  101.     points(3).X = x3
  102.     points(3).Y = y3
  103.     Polygon picCanvas.hdc, points(1), 3
  104.     ' If depth > 0, call SierpinskiErase to
  105.     ' erase the center of this triangle.
  106.     If depth >= 0 Then
  107.         picCanvas.FillColor = picCanvas.BackColor
  108.         SierpinskiErase depth, x1, y1, x2, y2, x3, y3
  109.     End If
  110.     ' Make the results visible.
  111.     picCanvas.Refresh
  112.     picCanvas.Picture = picCanvas.Image
  113. End Sub
  114. Private Sub CmdGo_Click()
  115. Dim depth As Integer
  116. Dim x1 As Single
  117. Dim y1 As Single
  118. Dim x2 As Single
  119. Dim y2 As Single
  120. Dim x3 As Single
  121. Dim y3 As Single
  122.     MousePointer = vbHourglass
  123.     DoEvents
  124.     ' Get the parameters.
  125.     If Not IsNumeric(txtDepth.Text) Then txtDepth.Text = "5"
  126.     depth = CInt(txtDepth.Text)
  127.     ' See where the first corners should be.
  128.     x1 = picCanvas.ScaleWidth * 0.05
  129.     x2 = picCanvas.ScaleWidth * 0.5
  130.     x3 = picCanvas.ScaleWidth * 0.95
  131.     y1 = picCanvas.ScaleHeight * 0.95
  132.     y2 = picCanvas.ScaleHeight * 0.05
  133.     y3 = y1
  134.     ' Draw the curve.
  135.     SierpinskiGasket depth, x1, y1, x2, y2, x3, y3
  136.     MousePointer = vbDefault
  137. End Sub
  138. ' Draw a hilbert curve.
  139. Private Sub Hilbert(ByVal depth As Integer, ByVal dx As Single, ByVal dy As Single)
  140.     If depth > 1 Then Hilbert depth - 1, dy, dx
  141.     picCanvas.Line -Step(dx, dy)
  142.     If depth > 1 Then Hilbert depth - 1, dx, dy
  143.     picCanvas.Line -Step(dy, dx)
  144.     If depth > 1 Then Hilbert depth - 1, dx, dy
  145.     picCanvas.Line -Step(-dx, -dy)
  146.     If depth > 1 Then Hilbert depth - 1, -dy, -dx
  147. End Sub
  148. Private Sub Form_Resize()
  149. Dim wid As Single
  150.     wid = ScaleWidth - picCanvas.Left
  151.     If wid < 120 Then wid = 120
  152.     picCanvas.Move picCanvas.Left, 0, _
  153.         wid, ScaleHeight
  154. End Sub
  155.